package com.mvc.controller;

import hbm.Cliente;
import hbm.ClienteDAO;
import hbm.DetalleVenta;
import hbm.DetalleVentaDAO;
import hbm.Empleados;
import hbm.EmpleadosDAO;
import hbm.Inventario;
import hbm.InventarioDAO;
import hbm.Marcas;
import hbm.MarcasDAO;
import hbm.Mercaderia;
import hbm.MercaderiaDAO;
import hbm.Pedidos;
import hbm.PedidosDAO;
import hbm.Proveedor;
import hbm.ProveedorDAO;

import hbm.Sucursal;
import hbm.SucursalDAO;
import hbm.Ventas;
import hbm.VentasDAO;

import java.io.IOException;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;



import dot.WrapperDetalleVenta;

@SuppressWarnings("serial")
public class VentasController extends HttpServlet {


	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	@SuppressWarnings("unchecked")
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String opcion = request.getParameter("opcion");

		if (opcion!=null && opcion.equals("validarEmpleado")){
			response.sendRedirect("./jsp/validarEmpleado.jsp");
		}
		
		if (opcion!=null && opcion.equals("validar")){
			String codigoEmpleado = request.getParameter("txtcodigoempleado");
			List <Empleados> listaEmpleados = new EmpleadosDAO().findAll();
			Iterator itr = listaEmpleados.listIterator();
			while (itr.hasNext()){
				Empleados e = (Empleados)itr.next();
				if (e.getCodigo().equals(codigoEmpleado)){
					request.getSession().setAttribute("idEmpleado", e.getId());
					request.getSession().setAttribute("idSucursal", e.getSucursal().getId());
					List <Cliente> listadoClientes = new ClienteDAO().findAll();
					request.getSession().setAttribute("listadoClientes", listadoClientes);
					
					
					response.sendRedirect("./jsp/ingresoVenta.jsp");
					break;
				}else{
					response.sendRedirect("./jsp/validarEmpleadoErr.jsp");
					break;
				}
			}
			
		}

		if (opcion != null && opcion.equals("venta")) {
			String boton = request.getParameter("boton");
			if (boton != null && boton.equals("Guardar")) {

				Ventas venta = new Ventas();

				Integer idCliente = Integer.parseInt(request.getParameter("idClie"));;
				Cliente clienteSeleccionado = new ClienteDAO().findById(idCliente);
				
				Integer idEmpleado = Integer.parseInt(request.getParameter("idEmpleado"));
				Empleados empleadoSeleccionado = new EmpleadosDAO().findById(idEmpleado);
				
				Integer idSucursal = Integer.parseInt(request.getParameter("idSucursal"));
				Sucursal sucursalSeleccionada = new SucursalDAO().findById(idSucursal);
				
				String tipoPago = request.getParameter("tipoPago");

				if (tipoPago.equals("0")) {
					venta.setTipoPago(true);
				}

				venta.setCliente(clienteSeleccionado);
				venta.setEmpleados(empleadoSeleccionado);
				venta.setSucursal(sucursalSeleccionada);

				String fechaVenta = request.getParameter("fecha_v");
				SimpleDateFormat dtTmp = new SimpleDateFormat("yyyy-MM-dd");
				Date fecha;
				try {
					fecha = dtTmp.parse(fechaVenta);
					venta.setFecha(fecha);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				Session session = new VentasDAO().getSession();
				try {
					Transaction tx = session.beginTransaction();
					session.saveOrUpdate(venta);
					tx.commit();
					session.close();
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				ArrayList<WrapperDetalleVenta> listado = new ArrayList<WrapperDetalleVenta>();
				for (int k = 0; k < 10; k++) {
					if (!request.getParameter("idMercaderia" + k).equals("")){
						WrapperDetalleVenta WDetalleVenta = new WrapperDetalleVenta();
						WDetalleVenta.setIdMercaderia(Integer.parseInt(request
								.getParameter("idMercaderia" + k)));
						WDetalleVenta.setCantidad(Integer.parseInt(request
								.getParameter("cantidad" + k)));
						WDetalleVenta.setPrecio(Double.parseDouble(request
								.getParameter("precio" + k)));
						listado.add(WDetalleVenta);
					}					
				}

				Ventas ventaGenerado = new VentasDAO().findById(venta.getId());

				for (Iterator iterador = listado.listIterator(); iterador.hasNext();) {
					WrapperDetalleVenta detalle = (WrapperDetalleVenta) iterador.next();
					Mercaderia mercaderiaSeleccionada = new MercaderiaDAO().findById(detalle.getIdMercaderia());
					DetalleVenta detalleVenta = new DetalleVenta();
					detalleVenta.setMercaderia(mercaderiaSeleccionada);
					detalleVenta.setCantidad(detalle.getCantidad());
					detalleVenta.setPrecioUnitario(new BigDecimal(detalle.getPrecio()));
					detalleVenta.setVentas(ventaGenerado);
					Session session1 = new DetalleVentaDAO().getSession();
					Transaction tx1 = session1.beginTransaction();

					new DetalleVentaDAO().save(detalleVenta);
					try {
						session1.saveOrUpdate(detalleVenta);
						tx1.commit();
						session1.close();

					} catch (HibernateException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
			response.sendRedirect("./jsp/listadoVentas.jsp");
		}
		
		if (opcion != null && opcion.equals("filtrar")) {
			Integer idCliente = Integer.parseInt(request.getParameter("idCliente"));
			Integer idSucursal = Integer.parseInt(request.getParameter("idSucursal"));
			Integer idEmpleado = Integer.parseInt(request.getParameter("idEmpleado"));

			
			Cliente clienteSeleccionada = new ClienteDAO().findById(idCliente);
			request.getSession().setAttribute("idClienteSeleccionado",clienteSeleccionada.getId());
			request.getSession().setAttribute("nombreClienteSeleccionada",clienteSeleccionada.getNombre());
			request.getSession().setAttribute("nitClienteSeleccionada",clienteSeleccionada.getNit());
			
			
			Empleados empleadoValidado = new EmpleadosDAO().findById(idEmpleado);
			request.getSession().setAttribute("idEmpleadoValidado", empleadoValidado.getId());
			request.getSession().setAttribute("nombreEmpleadoValidado", empleadoValidado.getNombre());
			
			String sucursalSeleccionada = new SucursalDAO().findById(idSucursal).getNombre();
			request.getSession().setAttribute("idSucursal", idSucursal);
			request.getSession().setAttribute("nombreSucursalSeleccionada", sucursalSeleccionada);
			
			List<Inventario> listaStock = new InventarioDAO().findAll();
			Iterator itr = listaStock.listIterator();

			List<Inventario> listaInventarioPorSucursal = new ArrayList<Inventario>();

			if (listaStock.size() != 0) {
				while (itr.hasNext()) {
					Inventario i = (Inventario) itr.next();
					if (i.getSucursal().getId() == idSucursal) {
						listaInventarioPorSucursal.add(i);
					}

				}
			}
			
			request.getSession().setAttribute("listaStock",listaInventarioPorSucursal);
			response.sendRedirect("./jsp/ingresoDetalleVenta.jsp");

		}
		if (opcion != null && opcion.equals("listarClientes")) {
			List<Cliente> listaCliente = new ClienteDAO().findAll();
			request.getSession().setAttribute("listadoClientes",
					listaCliente);
			response.sendRedirect("./jsp/ingresoPedido.jsp");
		}
		
		if (opcion != null && opcion.equals("listar")) {
			List <Ventas> listaVentas = new VentasDAO().findAll();
			request.getSession().setAttribute("listaVentas", listaVentas);
			response.sendRedirect("./jsp/listadoVentas.jsp");
		}
	}
	
}
